import torch
from d2l import torch as d2l

# 曾经sigmoid函数1/(1 + exp(−x))（4.1节提到过）很流行，因为它类似于阈值函数。
# 由于早期的人工神经网 络受到生物神经网络的启发，神经元要么完全激活要么完全不激活（就像生物神经元）的想法很有吸引力。
# 然而，它却是导致梯度消失问题的一个常见的原因
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.backward(torch.ones_like(x))
d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()], legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))

# 相反，梯度爆炸可能同样令人烦恼。为了更好地说明这一点，我们生成100个高斯随机矩阵，并将它们与某个 初始矩阵相乘。
# 对于我们选择的尺度（方差σ2 = 1），矩阵乘积发生爆炸。当这种情况是由于深度网络的初始 化所导致时，我们没有机会让梯度下降优化器收敛。
m = torch.normal(0, 1, size=(4, 4))
print(f'一个矩阵：{m}')
for i in range(100):
    m = torch.mm(m, torch.normal(0, 1, size=(4, 4)))
print(f'100个矩阵相乘：{m}')
